/**
 * Graph (图) 实现
 * 
 * 图是一种非线性数据结构，由节点(顶点)和边组成。
 * 图可以用来表示各种关系，如社交网络、地图、依赖关系等。
 * 
 * 时间复杂度：
 * - 添加顶点: O(1)
 * - 添加边: O(1)
 * - 删除顶点: O(V + E)
 * - 删除边: O(1)
 * - 深度优先搜索: O(V + E)
 * - 广度优先搜索: O(V + E)
 * 
 * 空间复杂度: O(V + E)
 */

class Graph {
  constructor() {
    // TODO: 初始化图
    // this.vertices = new Map() // 顶点映射
    // this.edges = new Map() // 边映射
    // this.directed = false // 是否为有向图
  }

  /**
   * 添加顶点
   * @param {string|number} vertex - 顶点
   */
  addVertex(vertex) {
    // TODO: 实现添加顶点逻辑
    // 1. 检查顶点是否已存在
    // 2. 如果不存在，添加到顶点映射中
    // 3. 初始化该顶点的邻接列表
  }

  /**
   * 添加边
   * @param {string|number} from - 起始顶点
   * @param {string|number} to - 目标顶点
   * @param {number} weight - 边的权重
   */
  addEdge(from, to, weight = 1) {
    // TODO: 实现添加边逻辑
    // 1. 检查两个顶点是否存在
    // 2. 如果不存在，先添加顶点
    // 3. 在起始顶点的邻接列表中添加目标顶点
    // 4. 如果是无向图，也要在目标顶点的邻接列表中添加起始顶点
  }

  /**
   * 删除顶点
   * @param {string|number} vertex - 要删除的顶点
   */
  removeVertex(vertex) {
    // TODO: 实现删除顶点逻辑
    // 1. 检查顶点是否存在
    // 2. 删除所有与该顶点相关的边
    // 3. 从顶点映射中删除该顶点
  }

  /**
   * 删除边
   * @param {string|number} from - 起始顶点
   * @param {string|number} to - 目标顶点
   */
  removeEdge(from, to) {
    // TODO: 实现删除边逻辑
    // 1. 检查两个顶点是否存在
    // 2. 从起始顶点的邻接列表中删除目标顶点
    // 3. 如果是无向图，也要从目标顶点的邻接列表中删除起始顶点
  }

  /**
   * 获取顶点的邻接顶点
   * @param {string|number} vertex - 顶点
   * @returns {Array} - 邻接顶点列表
   */
  getNeighbors(vertex) {
    // TODO: 实现获取邻接顶点逻辑
    // 1. 检查顶点是否存在
    // 2. 返回该顶点的邻接列表
  }

  /**
   * 深度优先搜索
   * @param {string|number} startVertex - 起始顶点
   * @param {Function} callback - 访问顶点的回调函数
   */
  dfs(startVertex, callback) {
    // TODO: 实现深度优先搜索逻辑
    // 1. 创建访问标记
    // 2. 使用递归或栈实现DFS
    // 3. 对每个访问的顶点调用回调函数
  }

  /**
   * 广度优先搜索
   * @param {string|number} startVertex - 起始顶点
   * @param {Function} callback - 访问顶点的回调函数
   */
  bfs(startVertex, callback) {
    // TODO: 实现广度优先搜索逻辑
    // 1. 创建访问标记
    // 2. 使用队列实现BFS
    // 3. 对每个访问的顶点调用回调函数
  }

  /**
   * 检查两个顶点是否相邻
   * @param {string|number} from - 起始顶点
   * @param {string|number} to - 目标顶点
   * @returns {boolean} - 是否相邻
   */
  hasEdge(from, to) {
    // TODO: 实现检查边是否存在逻辑
    // 1. 检查两个顶点是否存在
    // 2. 检查起始顶点的邻接列表中是否包含目标顶点
  }

  /**
   * 获取所有顶点
   * @returns {Array} - 所有顶点的数组
   */
  getVertices() {
    // TODO: 实现获取所有顶点逻辑
    // 1. 返回顶点映射的所有键
  }

  /**
   * 获取所有边
   * @returns {Array} - 所有边的数组
   */
  getEdges() {
    // TODO: 实现获取所有边逻辑
    // 1. 遍历所有顶点的邻接列表
    // 2. 收集所有边
    // 3. 返回边数组
  }

  /**
   * 获取图的顶点数量
   * @returns {number} - 顶点数量
   */
  getVertexCount() {
    // TODO: 实现获取顶点数量逻辑
    // 1. 返回顶点映射的大小
  }

  /**
   * 获取图的边数量
   * @returns {number} - 边数量
   */
  getEdgeCount() {
    // TODO: 实现获取边数量逻辑
    // 1. 计算所有顶点的邻接列表长度之和
    // 2. 如果是无向图，需要除以2
  }

  /**
   * 检查图是否为空
   * @returns {boolean} - 是否为空
   */
  isEmpty() {
    // TODO: 实现检查图是否为空逻辑
    // 1. 检查顶点数量是否为0
  }

  /**
   * 清空图
   */
  clear() {
    // TODO: 实现清空图逻辑
    // 1. 清空顶点映射
    // 2. 清空边映射
  }
}

module.exports = Graph
